package de.tudarmstadt.gdi1.project.cipher.substitution;

import de.tudarmstadt.gdi1.project.cipher.substitution.PinBoard;
import de.tudarmstadt.gdi1.project.cipher.substitution.ReverseRotor;
import de.tudarmstadt.gdi1.project.cipher.substitution.Rotor;
import java.util.LinkedList;

/* Aufgabe 11.2 
 * Enigma stellt eine voll funktionierende Enigma dar
 * @author Sabrina Diehl
 */

public class Enigma  implements de.tudarmstadt.gdi1.project.cipher.enigma.Enigma{
	
	/* encrypt verschluesselt einen Klartext
	 * @param text ist der Klartext
	 * @return Wort ist der Geheimtext
	 */
//encryt Verschluesseln
	@Override
	public String encrypt(String text) {
		int i = 0; //Index fuer die Schleife
		char a = 'S'; // a und b sind die beiden Buchstaben die verkabelt werden
		char b = 'D';
		LinkedList<Character> Geheim = new LinkedList<Character>();
		PinBoard P = new PinBoard(); 			// erstellen von PinBoard, Rotor und ReverseRotor
		ReverseRotor R = new ReverseRotor();
		Rotor Rotor1 = new Rotor();
		Rotor Rotor2 = new Rotor();
		Rotor Rotor3 = new Rotor();
	    P.Verkabelung(a, b);// hier werden a und b verbunden
	    Rotor v = Rotor1;// v ist der Rotor der gedreht wird
		while(i < text.length()){
			char t = text.charAt(i);
			P.translate(t);//zunaechst durchlaeuft der Text das Steckbrett
			Rotor1.translate(t, true);// als naechstes die 3 Walzen
			Rotor2.translate(t, true);
			Rotor3.translate(t, true);
			R.translate(t);//nun wird die Umkehrwalze durchlaufen
			Rotor3.translate(t, false);//nun nochmals die 3 Walzen aber in umgekehrter Reihenfolge
			Rotor2.translate(t, false);
			Rotor1.translate(t, false);
			P.translate(t);//zuletzt wird nochmal das Steckbrett durchlaufen
			Geheim.add(t);
			if (v.rotate()){//Auswahl der zu drehenden Walze
				if (v == Rotor1){
					v = Rotor2;
				}if (v == Rotor2){
					v = Rotor3;
				}v = Rotor1;
			}
			i++;// Erhoehung des Indexes
		}
		Rotor1.reset();// die Walzen werden wieder in die Ausgangssituation gedreht
		Rotor2.reset();
		Rotor3.reset();
		String Wort = Geheim.toString();
		return Wort;
	}
	
	/* decrypt entschluesselt einen Geheimtext
	 * @param text ist der Geheimtext
	 * @return Wort ist der Klartext 
	 */

	@Override
	public String decrypt(String text) {
		int i = 0;
		char a = 'S';
		char b = 'D';
		LinkedList<Character> Geheim = new LinkedList<Character>();
		PinBoard P = new PinBoard();
		ReverseRotor R = new ReverseRotor();
		Rotor Rotor1 = new Rotor();
		Rotor Rotor2 = new Rotor();
		Rotor Rotor3 = new Rotor();
	    P.Verkabelung(a, b);
	    Rotor v = Rotor1;
		while(i < text.length()){
			char t = text.charAt(i);
			P.translate(t);
			Rotor1.translate(t, true);
			Rotor2.translate(t, true);
			Rotor3.translate(t, true);
			R.translate(t);
			Rotor3.translate(t, false);
			Rotor2.translate(t, false);
			Rotor1.translate(t, false);
			P.translate(t);
			Geheim.add(t);
			if (v.rotate()){
				if (v == Rotor1){
					v = Rotor2;
				}if (v == Rotor2){
					v = Rotor3;
				}v = Rotor1;
			}
			i++;
		}
		Rotor1.reset();
		Rotor2.reset();
		Rotor3.reset();
		String Wort = Geheim.toString();
		return Wort;
	}


}
